package com.classtype.rtti.demo2;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.classtype.rtti.demo2.innerpackage.A2;
import com.classtype.rtti.demo2.innerpackage.HiddeC;

/**
 * 通过限制访问权限，看是否可以控制
 * 
 * @author Administrator
 * 
 */
public class HiddenImplementation {

	public static void main(String[] args) throws Exception {
		A2 a = HiddeC.makeA();
		a.f();
		System.out.println(a.getClass().getName());

		// if(a instanceof B2)无法编译，因为B2是不可见的
		// 但可以通过反射调用到方法
		callHiddenMethod(a, "f");
		callHiddenMethod(a, "v");
		callHiddenMethod(a, "w");
	}

	static void callHiddenMethod(Object a, String methodName) throws Exception {
		// getMethod 方法获得的是所有 public 访问级别的方法，包括从父类继承的方法，而 getDeclaredMethod
		// 获得的是自身类的所有方法，包括公有（public）方法，私有（private）方法等，而且不受限于访问权限，但是限定本类（可以访问本身类的方法或者内部类的方法）。
		Method m = a.getClass().getDeclaredMethod(methodName);
		m.setAccessible(true);
		m.invoke(a);
	}

}
